package com.cskaoyan.javase.oop2._1extends._9final._3variable._2member;

/**
 * @description: final修饰成员变量
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * final修饰成员变量表示该成员变量变成了一个常量,它在内存中的位置,生命周期,使用方式都不会改变
 * 语法:
 *     [访问权限修饰符] final 数据类型 变量名;
 * 直接写上述语法定义成员"常量",会报错,因为默认值不能当成final修饰成员变量的取值,因为final常量的取值一旦确定就不可更改了,所以成员变量的赋值方式还有:
 *      1.显式赋值
 *      2.构造代码块赋值
 *      3.构造器赋值
 *以上都是创建对象过程中的赋值方法,final修饰成员变量的赋值必须在创建对象过程明确
 * 所以以上三种赋值方式选择其一即可,也只能选择其中一个,因为是常量只能赋值一次
 * 需要注意的是,如果依赖构造器赋值,必须保证每个构造器都能完成成员变量的赋值
 *
 * 成员"常量"是不是真正意义上的常量?
 * 不是因为成员"常量"属于对象,每个对象可能都有自身的常量取值,完全可能不同
 * 它不是真正意义上的常量
 * 假如我们希望得到一个真正意义上的常量,在类的整个全局它的值都独一份,它应该是final修饰的静态成员变量
 *
 */
public class Demo {
    public static void main(String[] args) {
        Animal a = new Animal();
        //System.out.println(a.AGE);

        Animal a2 = new Animal(88);
        //System.out.println(a2.AGE);
        //a2.AGE = 100;
        //a2.
    }
}

class Animal {
    //Variable 'age' might not have been initialized
    private final int AGE;

    public int getAGE() {
        return AGE;
    }
    //public void setAGE(int AGE) {
    //    this.AGE = AGE;
    //}

    {
        //age = 20;
    }

    public Animal(int AGE) {
        this.AGE = AGE;
    }

    public Animal() {
        AGE = 18;
    }
}